CREATE TABLE 옵션 거부 (early-return 검증, GlueSQL #1972)
NOTE
내가 작업해서 머지한 PR #1972(2026-07-28 머지, 커밋
7c9009e) 기록. GlueSQL이 지원하지 않는CREATE TABLE ... TEMPORARY/LIKE/CLONE구문을 에러 없이 조용히 무시(사실상 빈 테이블 생성)하던 문제를 고침. 여기서 쓴&'static str기반 에러 표현 패턴이 이후 Issue #1975의 배경이 됨.
📌 개념
문제 — 지원하지 않는 옵션을 조용히 무시
리팩터링 전에는 CREATE TABLE t2 LIKE t1처럼 GlueSQL이 실제로 구현하지 않은 구문을 파싱은 성공시키고, 해당 옵션을 그냥 버린 채 빈 테이블을 만들어버림. CREATE TEMPORARY TABLE도 영구 테이블로 만들어짐 — 사용자 입장에서는 “성공했다”고 나오지만 기대한 동작이 아님.
해결 — early-return 검증 구조
// core/src/translate.rs:191-216 (일부 축약)
SqlStatement::CreateTable(SqlCreateTable {
if_not_exists,
name,
columns,
query,
engine,
constraints,
comment,
temporary,
like,
clone,
..
}) => {
let violation = if *temporary {
Some("TEMPORARY clause")
} else if like.is_some() {
Some("LIKE clause")
} else if clone.is_some() {
Some("CLONE clause")
} else {
None
};
if let Some(reason) = violation {
return Err(TranslateError::UnsupportedCreateTableOption(reason).into());
}
let columns = columns
.iter()
.map(|column_def| translate_column_def(column_def, params))
.collect::<Result<Vec<_>>>()?;
// ... 이후 컬럼 변환 등 정상 처리로 진행
}// core/src/translate/error.rs
#[error("unsupported CREATE TABLE option: {0}")]
UnsupportedCreateTableOption(&'static str),- 조기 반환(early-return) 검증 구조:
if/else if체인으로 지원하지 않는 옵션 중 하나라도 걸리면Some(reason)을 만들고, 그 즉시Err(...)로 반환 — 이후의 정상 처리 로직(컬럼 파싱 등)까지 갈 필요가 없음을 코드 흐름에서 명확히 보여줌 sqlparser가 파싱해준SqlCreateTable구조체에서 GlueSQL이 실제로 처리할 수 있는 필드(columns,name,if_not_exists등)만 구조 분해(destructuring)로 꺼내 쓰고, 나머지는..로 무시 —temporary/like/clone처럼 검증에만 쓰는 필드는 이름으로 명시해서 꺼냄- 새 에러 variant
TranslateError::UnsupportedCreateTableOption(&'static str)추가 — 이 시점엔 아직 문자열 기반. 오타를 컴파일러가 못 잡는 한계는 동일하게 존재함
검증
test-suite/fixtures/alter/create_table.sql에TEMPORARY/LIKE/CLONE3가지 케이스 각각 테스트 추가- 추가된 코드 32줄 전부 커버리지 포함, 전체 테스트 통과 확인 후 머지
NOTE
업데이트 — Issue #1975 작업에서 enum으로 전환됨 여기서 추가한
UnsupportedCreateTableOption(&'static str)은 이후 Issue #1975 작업(같은 브랜치)에서CreateTableOptionenum으로 타입화됨. 이슈 본문엔 이 variant가 명시적으로 언급되지 않았지만, 동일한 문자열 기반 패턴이라 같이 정리함. 자세한 내용은 아래 TranslateError Enum 타입화 노트 참고.
🔗 참고
- GlueSQL PR #1972 — Reject TEMPORARY/LIKE/CLONE options on CREATE TABLE
- (Rust) TranslateError Enum 타입화(strum·thiserror, GlueSQL #1975) - 핵심 개념 및 특징 정리 — 여기서 쓴 문자열 기반 패턴이 반복되던 걸 정리한 후속 작업
- (Rust) GlueSQL 프로젝트 구조와 필요 문법 개관 - 핵심 개념 및 특징 정리
- (Rust) 에러 처리(thiserror, Result, ? 연산자) - 핵심 개념 및 특징 정리
관련 문서
- (Rust) 오픈소스 컨트리뷰션 실전 가이드(이슈 찾기부터 PR 작성까지, GlueSQL 사례) - 핵심 개념 및 특징 정리 — 이 PR을 “버그 리포트형 이슈 + Summary/Test plan형 PR의 실제 예”로 인용하는 오픈소스 기여 가이드